package cn.hxsteel.storage.module.goods;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.hxsteel.core.exception.ValidateFailException;
import cn.hxsteel.model.vo.PageVO;
import cn.hxsteel.storage.core.base.BaseService;
import cn.hxsteel.storage.model.bo.Depot2BO;
import cn.hxsteel.storage.model.dao.DepotDAO;
import cn.hxsteel.storage.model.dao.GoodsDAO;
import cn.hxsteel.storage.model.po.DepotPO;
import cn.hxsteel.storage.model.po.GoodsPO;
import cn.hxsteel.storage.module.goods.model.DepotBO;
import cn.hxsteel.storage.module.goods.model.GoodsBO;

/**
 * 商品服务类
 */
@Service
public class GoodsService extends BaseService
{
    @Autowired
    private GoodsDAO goodsDAO;
    @Autowired
    private DepotDAO depotDAO;
    
    /**
     * 显示商品名称列表
     * 
     * @return
     */
    public List< GoodsPO > goodsList()
    {
	return goodsDAO.selListAll();
    }
    
    /**
     * 通过商品名称显示材质列表
     * 
     * @param name 商品名称
     * @return
     */
    public List< GoodsPO > goodsListByname( String name )
    {
	return goodsDAO.selListByname( name );
    }
    
    /**
     * 通过商品名称和材质显示产地列表
     * 
     * @param name 商品名
     * @param material 材质
     * @return
     */
    public List< GoodsPO > goodsListByNameAndMaterial( String name, String material )
    {
	return goodsDAO.selListByNameAndMaterial( name, material );
    }
    
    /**
     * 验证商品属性是否存在
     * 
     * @param name 商品名
     * @param material 材质
     * @param origin 产地
     * @param norm 规格
     * @return
     */
    public boolean existGoods( String name, String material, String origin, String norm )
    {
	if ( goodsDAO.selObj( name, material, origin, norm ) != null )
	{
	    return false;
	}
	else
	    return true;
    }
    
    /**
     * 查询是否有商品记录
     * 
     * @return
     */
    public boolean existGoods1()
    {
	if ( goodsDAO.selObj() != null )
	{
	    return true;
	}
	else
	    return false;
    }
    
    /**
     * 通过验证商品的完整信息确定是否已经存在
     * 
     * @param id 商品ID
     * @param name 商品名
     * @param material 材质
     * @param origin 产地
     * @param norm 规格
     * @return
     */
    public boolean existGoods2( int id, String name, String material, String origin, String norm )
    {
	if ( goodsDAO.selObjBy3( id, name, material, origin, norm ) != null )
	{
	    return false;
	}
	else
	    return true;
    }
    
    /**
     * 添加商品
     * 
     * @param goodsPO 商品的持久化类
     * @throws ValidateFailException
     */
    public void addgoods( GoodsPO goodsPO )
	    throws ValidateFailException
    {
	if ( existGoods( goodsPO.getName(), goodsPO.getMaterial(), goodsPO.getOrigin(), goodsPO.getNorm() ) == false )
	{
	    throw new ValidateFailException( "该商品所有类型已存在，请换一个。" );
	}
	else
	{
	    goodsDAO.save( goodsPO );
	}
    }
    
    /**
     * 分页查找商品
     * 
     * @param pageNo页码
     * @param pageSize 每页显示数目
     * @name 商品名
     */
    public List< GoodsBO > goodsPage( int pageNo, int pageSize, String name, String material, String origin )
    {
	PageVO< GoodsBO > pageVO = goodsDAO.selPageByName( pageNo, pageSize, name, material, origin );
	super.savePagerData( pageVO );
	return pageVO.getResult();
    }
    
    /**
     * 通过商品ID查找商品信息
     * 
     * @param id
     * @return
     */
    public GoodsPO goodsByID( int id )
    {
	return goodsDAO.selObjBy2( id );
    }
    
    /**
     * 修改商品
     * 
     * @param goodsPO 商品的持久化类
     * @throws ValidateFailException
     */
    public void updgoods( GoodsPO goodsPO )
	    throws ValidateFailException
    {
	if ( existGoods2( goodsPO.getId(), goodsPO.getName(), goodsPO.getMaterial(), goodsPO.getOrigin(), goodsPO.getNorm() ) == false )
	{
	    throw new ValidateFailException( "该商品所有类型已存在，请换一个。" );
	}
	else
	{
	    goodsDAO.update( goodsPO );
	}
    }
    
    /**
     * 分页查找仓库
     * 
     * @param pageNo 页码
     * @param pageSize 每页多少条记录
     * @return
     */
    public List< DepotBO > depotPage( int pageNo, int pageSize )
    {
	PageVO< DepotBO > pageVO = depotDAO.selPage( pageNo, pageSize );
	super.savePagerData( pageVO );
	return pageVO.getResult();
    }
    
    /**
     * 判断数据库是否存在仓库信息
     * 
     * @return
     */
    public boolean existDepot()
    {
	if ( depotDAO.seldepot() != null )
	{
	    return true;
	}
	else
	{
	    return false;
	}
    }
    
    /**
     * 通过仓库ID查询子仓库信息
     * 
     * @param id 仓库ID
     * @return
     */
    public DepotPO selDepotByID( int id )
    {
	return depotDAO.seldepotByID( id );
    }
    
    /**
     * 通过仓库name查询父仓库信息
     * 
     * @param name 仓库name
     * @return
     */
    public DepotPO selDepotByName( String name )
    {
	return depotDAO.seldepotByName( name );
    }
    
    /**
     * 修改操作验证仓库名称是否存在
     * 
     * @param id 仓库ID
     * @param pid 仓库PID
     * @param name 仓库name
     * @return
     */
    public boolean existdepotBy1( int id, int pid, String name )
    {
	return depotDAO.seldepotBy1( id, pid, name ) != null;
    }
    
    /**
     * 修改操作
     * 
     * @param depotPO 仓库持久化类
     * @throws ValidateFailException
     */
    public void upddepot( DepotPO depotPO )
	    throws ValidateFailException
    {
	if ( existdepotBy1( depotPO.getId(), depotPO.getPid(), depotPO.getName() ) == true )
	{
	    throw new ValidateFailException( "该仓库名已存在，请换一个。" );
	}
	else
	{
	    depotDAO.update( depotPO );
	}
    }
    
    /**
     * 查询出父仓库名称
     * 
     * @return
     */
    public List< DepotPO > depotList()
    {
	return depotDAO.selDepotList();
    }
    
    /**
     * 添加操作验证仓库名称是否存在
     * 
     * @param pid 仓库PID
     * @param name 仓库name
     * @return
     */
    public boolean existdepotByNameAndPID( int pid, String name )
    {
	return depotDAO.seldepotByNameAndPID( pid, name ) != null;
    }
    
    /**
     * 添加操作
     * 
     * @param depotPO 仓库持久化类
     * @throws ValidateFailException
     */
    public void adddepot( DepotPO depotPO )
	    throws ValidateFailException
    {
	if ( existdepotByNameAndPID( depotPO.getPid(), depotPO.getName() ) == true )
	{
	    throw new ValidateFailException( "该仓库名已存在，请换一个。" );
	}
	else
	{
	    depotDAO.save( depotPO );
	}
    }
    
    /**
     * 录入基础数据分页
     * 
     * @param pageNo 页码
     * @param pageSize 每页多少条记录
     * @param id 仓库ID
     * @return
     */
    public List< Depot2BO > depotPage1( int pageNo, int pageSize, int id )
    {
	PageVO< Depot2BO > pageVO = depotDAO.selPage1( pageNo, pageSize, id );
	super.savePagerData( pageVO );
	return pageVO.getResult();
    }
}